package com.itheima.fanxing;

import java.util.ArrayList;

/*
泛型：
    好处：避免类型转换异常
          把运行期异常提前到编译期
泛型类：
    做法：放在创建的类后面
    明确数据类型的操作放在创建对象的时候
泛型方法：
    做法：把泛型加在返回值前面
    明确数据类型的操作放在调用方法的时候
泛型接口：
    做法：把泛型加在接口名后面
    实现类不给泛型
    实现类确定具体的数据类型
泛型通配符
    ? extends E:接收E及其子类型
    ? super E:接收E及其父类型

 */
public class GenericityDemo {
    public static void main(String[] args) {
        /*//创建集合
        ArrayList<String> list = new ArrayList<>();
        //添加元素
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");
        //创建迭代器
        Iterator it = list.iterator();
        //增强for遍历（foreach()语句）
        for (String s : list) {
            System.out.println(s);
        }*/
        //创建Box对象泛型String
        //创建Box对象泛型Integer
        /*Box<String> box1 = new Box<>();
        box1.setE("aaa");
        System.out.println(box1.getE());
        System.out.println("--------------------------");
        Box<Integer> box2 = new Box<>();
        box2.setE(123);
        System.out.println(box2.getE());*/
        //泛型方法
        /*ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        //集合转数组划定字符串数组类型，长度为集合长度
        String[] strings = list.toArray(new String[list.size()]);
        for (String s : strings) {
            System.out.println(s);
        }
        System.out.println(Arrays.toString(strings));*/
        //调用自定义添加元素的泛型方法
        /*ArrayList<String> ts = addElement(new ArrayList <> (), "aa", "bb", "cc", "dd");
        System.out.println(ts);*/
        //创建集合对象，调用addElement泛型方法添加整数类型元素，遍历集合
        /*ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> list1 = addElement(list, 1, 2, 3, 4);
        for (Integer it : list1) {
            System.out.println(it);
        }
        System.out.println(list1);*/
        //泛型接口
        //两种实现类，确定泛型，不确定泛型
        /*GenericityImpl1<String> s = new GenericityImpl1<>();
        s.method("aaa");
        GenericityImpl2 s1 = new GenericityImpl2();
        s1.method(123);*/
    }
    //自定义的添加元素的泛型方法
    public static <T> ArrayList<T> addElement(ArrayList<T> list,T t1,T t2,T t3,T t4){
        list.add(t1);
        list.add(t2);
        list.add(t3);
        list.add(t4);
        return list;
    }
}
//泛型接口
interface Genericity<E>{
     void method(E e);
}
//实现类不给泛型
class GenericityImpl2 implements Genericity<Integer>{
    @Override
    public void method(Integer it) {
        System.out.println(it);
    }
}
//实现类确定具体的数据类型
class GenericityImpl1<E> implements Genericity<E>{
    @Override
    public void method(E e) {
        System.out.println(e);
    }
}
